export default class SendPool {
  // 待办任务队列
  private queue: (() => Promise<string>)[];

  // 并行执行数量
  private readonly size: number;

  // 任务总数量
  private totalCount: number = 0;

  // 任务已完成数量
  private totalFinishCount = 0;

  constructor(size: SendPool['size']) {
    this.size = size;
  }

  // 设置任务队列
  setQueue(queue: SendPool['queue']) {
    this.queue = queue;
    this.totalCount = queue.length;
    this.totalFinishCount = 0;
  }

  // 开始执行
  start(changeCb?: (finishTotal: number, total: number) => void, size = this.size) {
    const taskList = this.queue.splice(0, size);

    // 并行执行任务
    taskList.forEach((task: SendPool['queue'][0]) => {
      task().then(() => {
        // 标记完成数量 +1
        this.totalFinishCount += 1;
        // 任务进度状态改变，触发回调
        changeCb?.(this.totalFinishCount, this.totalCount);
        // 任务执行成功，开启下一个任务
        this.start(changeCb, 1);
      })
        // 执行失败，重试
        .catch((err) => {
          console.error(err);
          this.queue.unshift(task);
          this.start(changeCb, 1);
        });
    });
  }
}